gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringlib/global.cpp

    /**********************************************************************
//
//
//        ##########                          ######  #########   # ######    #
//      #############                      ########### ######### #########  ###
//     ######## # ###  ##                 ############# ##    ## #####  # ####
//     ####  ##    ## ###                 ###     ### # #      #####   #####
//          #     ###  #            #     ##       ##  ##      ##     ###
//         ## ###### ##      ##  ####    ####          #       #     ##
//       #########  ###  ## ### #######   ######      ##      ##    ###
//      ######      ##  ######  ##  ##       ####     #      ##     ####
//     #######     ##   ###### ##  ###          ##   ##     ###    ######
//     #########   ##  ###### ## ######         ### ##    ###      #  #####
//    ##    ###### ####### ### #### ##  ## #######  ########      ##    ####
//    ##      #### ###  #  ### ### ##  ##########   ######       ##      ####
//   ##         ##                ##   #########    ####         #         ##
//               #              ###
//                              ##
//                             ###
//                             ##
//
//
//							RingSDK类库 ringlib.lib
//作者:临风
//
//版本:1.0
//
//声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:ringphone@sina.com
//
//原文件名:global.cpp
//
//说明:全局函数实现,方便编程
//
**********************************************************************/

#define MAKE_SELF_LIB

#include "ringlib.h"
#include <process.h>

HINSTANCE	m_hInst = NULL;
HWND		m_hWnd = NULL;

BOOL		GetPathStr(LPCTSTR path,LPSTR temp,int* mark,int len);
DWORDLONG	GetPathSize1(LPCTSTR szPath,int& nFileCnt,int& nPathCnt);
BOOL		TrayMessage(HWND hDlg, DWORD dwMessage, UINT uID, HICON hIcon, LPCSTR lpszTip);


//初始化类库
void InitRingLib(HWND hWnd,HINSTANCE hInst/*=NULL*/)
{
	m_hWnd  = hWnd;
	m_hInst = hInst?hInst:GetModuleHandle(NULL);
}

HINSTANCE GetInstance()
{
	return m_hInst;
}

HWND GetMainWnd()
{
	return m_hWnd;
}

//内存分配,分配失败系统自动防护。(new则防护不住)
//#ifdef _DEBUG
//LPVOID _New(DWORD dwSize, char *file, int line)
//#else
LPVOID New(DWORD dwSize)
//#endif
{
	if(dwSize == 0)
		return NULL;
//	return GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,dwSize);


	try
	{
		LPSTR res = new char[dwSize];
		if(res)
			memset(res,0,dwSize);
		return res;
	}
	catch(...)
	{
		return NULL;
	}
//*/
}

// 释放由 _New() 申请的内存
//#ifdef _DEBUG
//LPVOID _Del(LPVOID lpv, char *file, int line)
//#else
LPVOID Del(LPVOID lpv)
//#endif
{
	if (lpv == NULL)
	{
		return NULL;
	}
	LPSTR s = (LPSTR)lpv;
	delete []s;
	//GlobalFree(lpv);
	
	return NULL;
}


//检测可用内存
DWORD GetFreeMem(void)
{
	MEMORYSTATUS mem;
	mem.dwLength=sizeof(MEMORYSTATUS);

	GlobalMemoryStatus(&mem);

	return mem.dwAvailPageFile;
}



//////////////////////////////////////////////////////////////////////////////////////

BOOL TrayMessage(HWND hDlg,DWORD dwMessage,UINT uID,HICON hIcon,LPCTSTR lpszTip)
{
	NOTIFYICONDATA tnd;

	tnd.cbSize	= sizeof(NOTIFYICONDATA);
	tnd.hWnd		= hDlg;
	tnd.uID		= uID;

	tnd.uFlags	= NIF_MESSAGE|NIF_ICON|NIF_TIP;
	tnd.uCallbackMessage	= MYWM_ICON;
	tnd.hIcon	= hIcon;
   if(lpszTip)
   {	
		//tnd.szTip大小为64,如果lpszTip大于该值则截断
   	memset(tnd.szTip,0,sizeof(tnd.szTip));
		strncpy(tnd.szTip,lpszTip,sizeof(tnd.szTip)-1);		
   }
   else
   	*tnd.szTip = '\0';

	return Shell_NotifyIcon(dwMessage, &tnd);
}

BOOL AddInTaskBar(HWND hWnd,HICON hIcon,LPCTSTR s,UINT uId/* = 0*/)
{
	return TrayMessage(hWnd,NIM_ADD,uId,hIcon,s);
}

BOOL ModiInTaskBar(HWND hWnd,HICON hIcon,LPCTSTR s,UINT uId/* = 0*/)
{
	return TrayMessage(hWnd,NIM_MODIFY,uId,hIcon,s);
}

BOOL DelInTaskBar(HWND hWnd,UINT uId/*=0*/)
{
	return TrayMessage(hWnd,NIM_DELETE,uId,NULL,NULL);
}

void Errmsg(LPCTSTR format,...)
{
   char buf[MAX_PATH];

	va_list ap;

   if(format)
	{
		va_start(ap, format);
		_vsntprintf(buf,MAX_PATH-2,format,ap);
		//vsprintf(buf, format, ap);
		va_end(ap);
	}
	MessageBox(GetFocus(),buf,"错误",MB_OK | MB_ICONWARNING);
}

BOOL Confirm(LPCTSTR format,...)
{
   char buf[MAX_PATH];

	va_list ap;

   if(format)
	{
		va_start(ap, format);
		_vsntprintf(buf,MAX_PATH-2,format,ap);
		//vsprintf(buf, format, ap);
		va_end(ap);
	}

	if(MessageBox(GetFocus(),buf,"确认",MB_YESNO | MB_ICONQUESTION)==IDYES)
   	return TRUE;
   else
   	return FALSE;
}

//限定在MAX_PATH字节数以内
void MsgBox(LPCTSTR szTitle,LPCTSTR format, ...)
{
   char buf[MAX_PATH];
	
	va_list ap;
	
   if(format)
	{
		va_start(ap, format);
		_vsntprintf(buf,MAX_PATH-2,format,ap);
		//vsprintf(buf, format, ap);
		va_end(ap);
	}	
	MessageBox(GetFocus(),buf,szTitle,MB_OK);
}

//带字数控制,由dwMsgLength指定
int MsgBoxEx(LPCTSTR szTitle,UINT uType,DWORD dwMsgLength,LPCTSTR format, ...)
{
   LPSTR buf = (LPSTR)New(dwMsgLength+2);
   if(!buf)
		return 0;
	
	va_list ap;
	
   if(format)
	{
		va_start(ap, format);
		_vsntprintf(buf,dwMsgLength,format,ap);
		//vsprintf(buf, format, ap);
		va_end(ap);
	}
	
   int res = MessageBox(GetFocus(),buf,szTitle,MB_OK);
   Del(buf);

	return res;
}

void ShowHelpInfo(LPCTSTR szText,LPCTSTR szCaption,LPCTSTR lpszIcon)
{
	MSGBOXPARAMS msgbox ;

   msgbox.cbSize = sizeof(msgbox);
   msgbox.hwndOwner = m_hWnd;
   msgbox.hInstance = m_hInst;
   msgbox.lpszText = szText;
   msgbox.lpszCaption = szCaption;
   msgbox.dwStyle = MB_OK | MB_USERICON ;
   msgbox.lpszIcon = lpszIcon;
   msgbox.dwContextHelpId = 1;
   msgbox.lpfnMsgBoxCallback = NULL ;
   msgbox.dwLanguageId = MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);

   MessageBoxIndirect(&msgbox);
}

BOOL MkDir(LPCTSTR szPath)
{
	char temp[MAX_PATH];
	int nPathMark = 0;
   int len = strlen(szPath);
   DWORD flag;

   ZeroMemory(temp,MAX_PATH);

   if(CreateDirectory(szPath,NULL))
   	return TRUE;
   else
	   while(GetPathStr(szPath,temp,&nPathMark,len))
   	{
      	CreateDirectory(temp,NULL);
	      temp[nPathMark-1] = '\\';
	   }

   flag = GetFileAttributes(szPath);
   if(flag == 0xFFFFFFFF || (flag & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
   	return FALSE;
   else
   	return TRUE;
}

BOOL GetPathStr(LPCTSTR path,LPSTR temp,int* mark,int len)
{
   if(path[*mark] == '\0')
     	return FALSE;

   for(;*mark<len;(*mark)++)
   {
      temp[*mark] = path[*mark];
   	if(path[*mark] == '\\')
      {
         temp[*mark] = '\0';
         (*mark) ++;
      	return TRUE;
      }
   }
   temp[*mark] = '\0';
   return TRUE;
}

HINSTANCE ringExec(LPCTSTR lpFile,LPCTSTR lpDir/*=NULL*/,LPCTSTR lpParam/*=NULL*/,LPCTSTR lpOp/*=NULL*/,INT nShowCmd/*=SW_SHOW*/)
{
   if(lpOp == NULL)
   	lpOp = "open";

	return ShellExecute(NULL,lpOp,lpFile,lpParam,lpDir,nShowCmd);

}

//执行文件(调用CreateProcess)
int RunProcess(LPCTSTR lpFile,LPCTSTR lpDir,LPCTSTR lpParam,DWORD dwWait,int nShowCmd,
							DWORD dwCreateFlag,LPPROCESS_INFORMATION lpProcessInformation)
{
	STARTUPINFO si;
	memset(&si,0,sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = nShowCmd;
	
	PROCESS_INFORMATION pi;

	if(CreateProcess(lpFile,(LPSTR)lpParam,NULL,NULL,FALSE,dwCreateFlag,NULL,lpDir,&si,&pi))
	{
		if(lpProcessInformation)
			memcpy(lpProcessInformation,&pi,sizeof(PROCESS_INFORMATION));
		else
		{
			if(pi.hThread)
				CloseHandle(pi.hThread);
			if(pi.hProcess)
				CloseHandle(pi.hProcess);
		}

		if(dwWait != 0)
			return (WaitForInputIdle(pi.hProcess,dwWait) == 0);
		else
			return TRUE;
	}
	return 0;
}

BOOL SelectDir(LPTSTR lpDir,LPCTSTR lpszTitle/*="选择路径"*/,
					UINT uFlag/*=BIF_RETURNONLYFSDIRS*/,BFFCALLBACK lpfn/*=NULL*/,
					LPARAM lParam/*=0*/,int iImage/*=0*/)
{
   if(lpDir == NULL)
   	return FALSE;

   BROWSEINFO bi;
   ITEMIDLIST* pidl;

   bi.hwndOwner = NULL;
   bi.pidlRoot = NULL;
   bi.pszDisplayName = lpDir;
   bi.lpszTitle = lpszTitle;
   bi.ulFlags = uFlag;//BIF_RETURNONLYFSDIRS;
   bi.lpfn = lpfn;
   bi.lParam = lParam;
   bi.iImage = iImage;

   pidl = SHBrowseForFolder(&bi);
    /*Display "SelectFolder" dialogbox,Getthefoldername and convertit in to a
    ITEMLIST data structure.*/

   if(pidl == NULL)
   {
   	lpDir[0] = 0;
      return FALSE;
   }
   if(!SHGetPathFromIDList(pidl,lpDir))
   {
      lpDir[0] = 0;
      return FALSE;
   }
   return TRUE;
}

DWORD GetFilePointer(HANDLE hFile)
{
	return SetFilePointer(hFile,0,NULL,FILE_CURRENT);
}

DWORDLONG GetPathSize(LPCTSTR lpszPathName,int* lpnFileCnt/*=NULL*/,int* lpnPathCnt/*=NULL*/)
{
   DWORD flag = GetFileAttributes(lpszPathName);
   DWORDLONG cnt;
   int nFileCnt = 0,nPathCnt = 0;

   if(flag == 0xFFFFFFFF)
   {
   	if(lpnFileCnt)
      	*lpnFileCnt = 0;
      if(lpnPathCnt)
      	*lpnPathCnt = 0;
      return 0;
   }
   else if((flag & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
   {
   	cnt = GetPathSize1(lpszPathName,nFileCnt,nPathCnt);
      if(lpnFileCnt)
        	*lpnFileCnt = nFileCnt;
      if(lpnPathCnt)
      	*lpnPathCnt = nPathCnt;
      return cnt;
   }
   else
   {
      WIN32_FIND_DATA wInfo;
   	HANDLE hFile = FindFirstFile(lpszPathName,&wInfo);
      if(INVALID_HANDLE_VALUE != hFile)
      {
      	if(lpnFileCnt)
         	*lpnFileCnt = 1;
         if(lpnPathCnt)
	      	*lpnPathCnt = 0;
         FindClose(hFile);
         return ((DWORDLONG)wInfo.nFileSizeHigh << 32) + wInfo.nFileSizeLow;
      }
      else
      {
      	if(lpnFileCnt)
   			*lpnFileCnt = 0;
         if(lpnPathCnt)
	      	*lpnPathCnt = 0;
		   return 0;
      }
   }
}

DWORDLONG GetPathSize1(LPCTSTR szPath,int& nFileCnt,int& nPathCnt)
{
	WIN32_FIND_DATA wInfo;
   HANDLE hFile;
   char temp[MAX_PATH],next[MAX_PATH];
   DWORDLONG dwFileSizeTotal = 0;

  	wsprintf(temp,"%s\\*.*\0\0",szPath);

  	hFile = FindFirstFile(temp,&wInfo);

   if(INVALID_HANDLE_VALUE != hFile)
   {
	   while(FindNextFile(hFile,&wInfo))
      {
      	if(strcmp(wInfo.cFileName,"..") == 0)
         	continue;

         if((wInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
         {
            nPathCnt ++;
         	wsprintf(next,"%s\\%s\0\0",szPath,wInfo.cFileName);
            dwFileSizeTotal += GetPathSize1(next,nFileCnt,nPathCnt);
         }
         else
         {
         	nFileCnt ++;
            dwFileSizeTotal += ((DWORDLONG)wInfo.nFileSizeHigh << 32) + wInfo.nFileSizeLow;
         }
      }
      FindClose(hFile);
      return dwFileSizeTotal;
   }
   else
   	return 0;
}

/*
BOOL CheckCDROM(LPTSTR szCdrom)
{
	char cDriveLetter[]="DEFGHIJKLMNOPQRSTUVWXYZ";
  	char szRootName[3];
   int i;

  	for(i=0;i<23;i++)
  	{
      szRootName[0]=cDriveLetter[i];
      szRootName[1]=':';
      szRootName[2]='\0';

    	if(GetDriveType(szRootName)==DRIVE_CDROM)
      {
      	wsprintf(szCdrom,(LPCTSTR)szRootName);
         return TRUE;
      }
	}
   return FALSE;
}
*/

int GetErrMessage(DWORD dwErrcode,LPTSTR lpstr,int nLen)
{
	if(lpstr == NULL)
		return 0;

	return FormatMessage( 
						FORMAT_MESSAGE_FROM_SYSTEM | 
						FORMAT_MESSAGE_IGNORE_INSERTS,
						NULL,
						dwErrcode,
						MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
						lpstr,
						nLen,
						NULL 
						);
}

int WinWidth(HWND hWnd)
{
	RECT rt;
   GetWindowRect(hWnd,&rt);

   return (rt.right-rt.left);
}

int WinHeight(HWND hWnd)
{
	RECT rt;
   GetWindowRect(hWnd,&rt);

   return (rt.bottom-rt.top);
}

int ClientWidth(HWND hWnd)
{
	RECT rt;
   GetClientRect(hWnd,&rt);

   return rt.right;
}

int ClientHeight(HWND hWnd)
{
	RECT rt;
   GetClientRect(hWnd,&rt);

   return rt.bottom;
}

void EasyMove(HWND hWnd)
{
	SendMessage(hWnd,WM_NCLBUTTONDOWN,(WPARAM)HTCAPTION,MAKELPARAM(5,5));
}

BOOL SetAutoRun(LPCTSTR szKeyName,LPCTSTR szParam/*=NULL*/)
{
	HKEY  hKey1;

  	DWORD dwDisposition;
  	LONG  lRetCode;

   char  cmd[400];


   lRetCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0, NULL, REG_OPTION_NON_VOLATILE,
                           KEY_WRITE,NULL,&hKey1,&dwDisposition);
   if (lRetCode != ERROR_SUCCESS)
      return FALSE;

   ZeroMemory(cmd,400);
   GetModuleFileName(m_hInst,cmd,400);

   if(szParam)
   {
   	strcat(cmd," ");
      strcat(cmd,szParam);
   }

   lRetCode = RegSetValueEx( hKey1,
                             szKeyName,
                             0,
                             REG_SZ,
                             (LPBYTE)cmd,
                             (DWORD)(strlen(cmd)));

	if(lRetCode != ERROR_SUCCESS)
   	return FALSE;

   return TRUE;
}

BOOL DelAutoRun(LPCTSTR szKeyName)
{
   char  s[256]="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\";
   HKEY  hKey1;
  	DWORD dwDisposition;
  	LONG  lRetCode;


   lRetCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,s,0, NULL, REG_OPTION_NON_VOLATILE,
                             KEY_WRITE,NULL,&hKey1,&dwDisposition);

   if(lRetCode != ERROR_SUCCESS)
      return FALSE;

   strcat(s,szKeyName);
	if(RegDeleteValue(hKey1,s) == ERROR_SUCCESS)
   	return TRUE;
   else
   {
   	//Errmsg("错误:删除注册表\"HKEY_LOCAL_MACHINE\\%s\"出错.",s);
   	return FALSE;
   }
}

HANDLE RegOnlyWindow(LPCTSTR szMutex)
{
	HANDLE hImHere = CreateMutex(NULL,TRUE,szMutex);

	if(GetLastError() == ERROR_ALREADY_EXISTS)
	{
	   CloseHandle(hImHere);
	   return NULL;
	}
   else
	   //第一次运行,不关闭句柄,阻止第二副本执行。退出时系统自动释放
   	return hImHere;
}

void PaintNull(HWND hWnd)
{
   PAINTSTRUCT ps;

   BeginPaint(hWnd,&ps);
   EndPaint(hWnd,&ps);
}

HANDLE NewThread(LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParam)
{
	//gdwThreadId ++;
	UINT nThreadID;
	return (HANDLE)_beginthreadex(NULL,0,(unsigned int (__stdcall *)( void * ))lpStartAddress,lpParam,0,&nThreadID);
	//return CreateThread(NULL,0,lpStartAddress,lpParam,0,&nThreadID);
}

int OSType(void)
{
	OSVERSIONINFOEX OsVersionInfo;
	BOOL bOK;
	
   memset(&OsVersionInfo,0,sizeof(OSVERSIONINFOEX));
   OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
	
	bOK = GetVersionEx((LPOSVERSIONINFO)&OsVersionInfo);
   if(!bOK)
   {
      //失败,不支持OSVERSIONINFOEX,使用OSVERSIONINFO
      OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
      if(!GetVersionEx((LPOSVERSIONINFO)&OsVersionInfo))
         return FALSE;
   }
	
	switch (OsVersionInfo.dwPlatformId)
	{
	case	VER_PLATFORM_WIN32_WINDOWS:
		if(OsVersionInfo.dwMajorVersion > 4 || 
			(OsVersionInfo.dwMajorVersion == 4 && OsVersionInfo.dwMinorVersion > 0))
			return OST_WIN98;
		else 
			return OST_WIN95;		
	case	VER_PLATFORM_WIN32_NT:
		if(OsVersionInfo.dwMajorVersion <= 4)
			return OST_WINNT;
		else if(OsVersionInfo.dwMajorVersion == 5)
		{
			if(bOK)
			{
				if(OsVersionInfo.wProductType == VER_NT_WORKSTATION)
					return OST_WIN2KPRO;
				else if(OsVersionInfo.wProductType == VER_NT_SERVER)
					return OST_WIN2KSERVER;
			}
			return OST_WIN2K;
		}
		break;
	case	VER_PLATFORM_WIN32s:
		return OST_WIN31;
	}
	return OST_UNKNOWN;
}

BOOL GetBmpSize(HBITMAP hbm,SIZE *size)
{
	BITMAP bm;

   if(GetObject(hbm,sizeof(BITMAP),&bm)==0)
   	return FALSE;

   size->cx=bm.bmWidth;
   size->cy=bm.bmHeight;

   return TRUE;
}

/**************************************************************
//
//程序间传递数据
//
//参数:
//		hWnd:接收数据的目标窗口
//		szNAme:共享数据名称,该名称唯一标识该数据,目标窗口通过该名称取得数据
//		lpData:要传递的数据指针
//		dwSize:数据大小
//
****************************************************************/
BOOL SendShareData(HWND hWnd,LPCTSTR szName,LPVOID lpData,DWORD dwSize)
{
	HANDLE hfile;
	LPBYTE lpvMem,lpTemp=(LPBYTE)lpData;
	BOOL bOK;

	hfile = CreateFileMapping(
                (HANDLE)0xFFFFFFFF, 	// use paging file
                NULL,                	// no security attributes
                PAGE_READWRITE,      	// read/write access
                0,                   	// size: high 32-bits
                dwSize+sizeof(DWORD),			      	// size: low 32-bits
                szName);

	if(hfile == NULL || GetLastError() == ERROR_ALREADY_EXISTS)
	{
		CloseHandle(hfile);
		return FALSE;
	}

	lpvMem = (LPBYTE)MapViewOfFile(hfile,FILE_MAP_WRITE,0,0,0);

	if(lpvMem == NULL)
	{
		CloseHandle(hfile);
		return FALSE;
	}

	for(DWORD i=0;i<dwSize;i++)
	{
		*lpvMem = *lpTemp;
		lpvMem ++;
		lpTemp ++;
	}

	bOK = SendMessage(hWnd,MYWM_SHAREDATA,dwSize,0);
	
	UnmapViewOfFile(lpvMem);
   CloseHandle(hfile);
	
	return bOK;
}

/**************************************************************
//
//接收另一程序发送的数据
//
//参数:
//		szNAme:共享数据名称,程序通过该名称取得数据
//		lpData:要接收数据的数据指针地址
//
****************************************************************/
BOOL GetShareData(LPCTSTR szName,LPVOID* lpData,DWORD dwSize)
{
	HANDLE hfile;

	hfile = OpenFileMapping(FILE_MAP_READ,FALSE,szName);
	if(hfile)
	{
		LPVOID lpvMem = (LPBYTE)MapViewOfFile(hfile,FILE_MAP_READ,0,0,0);

		if(lpvMem == NULL)
			return FALSE;
	
		*lpData = New(dwSize);
		if(*lpData == NULL)
		{
			UnmapViewOfFile(lpvMem);
			CloseHandle(hfile);
			return FALSE;
		}
		
		LPBYTE lpTemp1 = (LPBYTE)*lpData,lpTemp2 = (LPBYTE)lpvMem;

		for(DWORD i=0;i<dwSize;i++)
		{
			*lpTemp1 = *lpTemp2;
			lpTemp1 ++;
			lpTemp2 ++;
		}
		UnmapViewOfFile(lpvMem);
		CloseHandle(hfile);

		return TRUE;
	}
	return FALSE;
}

/*****************************************************************
//
//	允许/禁止应用程序权限
//		参数:
//		lpName:权限名(winnt.h)如SE_DEBUG_NAME可关闭“拒绝访问”的进程
//										  SE_SHUTDOWN_NAME可关机
//		bEnable:允许,禁止标记
//
*****************************************************************/
BOOL EnableNTRight(LPCTSTR lpName,BOOL bEnable/*=TRUE*/)
{
	BOOL bOK= FALSE;
	HANDLE hToken= NULL;

	if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
	{
		TOKEN_PRIVILEGES tkp;
		
		tkp.PrivilegeCount=1;
		LookupPrivilegeValue(NULL,lpName,&tkp.Privileges[0].Luid);
		tkp.Privileges[0].Attributes= bEnable?SE_PRIVILEGE_ENABLED:0;		
		AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL);
		
		bOK = (GetLastError()==ERROR_SUCCESS);
		
		CloseHandle(hToken);
	}
	return bOK;
}	
	
	
/*
void MoveImage(HWND hWnd,HBITMAP hBkg,HBITMAP hBmp,HBITMAP hTemp,int iWidth,int iHeight,POINTS Oldpt,LONG lParam)
{
	HDC hDC,hMemDC,hBkgDC,hTempDC;
   POINTS ppt,pt,npt;

   ppt=MAKEPOINTS(lParam);

   hDC=GetDC(hWnd);
   hMemDC=CreateCompatibleDC(hDC);
   hBkgDC=CreateCompatibleDC(hDC);
   hTempDC=CreateCompatibleDC(hDC);

   SelectObject(hMemDC,hBmp);
   SelectObject(hBkgDC,hBkg);
   SelectObject(hTempDC,hTemp);

   if((ppt.x-Oldpt.x)>iWidth || (ppt.y-Oldpt.y)>iHeight)
   {
   	//BitBlt(hTempDC,0,0,2*iWidth,2*iHeight,hBkgDC,Oldpt.x,Oldpt.y,SRCCOPY);
      BitBlt(hDC,Oldpt.x,Oldpt.y,iWidth,iHeight,hBkgDC,Oldpt.x,Oldpt.y,SRCCOPY);
      BitBlt(hDC,ppt.x,ppt.y,iWidth,iHeight,hMemDC,0,0,SRCCOPY);
   }
   else if((Oldpt.x-ppt.x)>iWidth || (Oldpt.y-ppt.y)>iHeight)
   {
   	//BitBlt(hTempDC,0,0,2*iWidth,2*iHeight,hBkgDC,Oldpt.x,Oldpt.y,SRCCOPY);
      BitBlt(hDC,Oldpt.x-iWidth,Oldpt.y-iHeight,2*iWidth,2*iHeight,hBkgDC,Oldpt.x-iWidth,Oldpt.y-iHeight,SRCCOPY);
      BitBlt(hDC,ppt.x,ppt.y,iWidth,iHeight,hMemDC,0,0,SRCCOPY);
   }
   else
   {
      if(ppt.x>=Oldpt.x)
      {
      	pt.x=Oldpt.x;
         npt.x=(short)(ppt.x-Oldpt.x);
      }
      else
      {
      	pt.x=ppt.x;
         npt.x=0;
      }
      if(ppt.y>=Oldpt.y)
      {
      	pt.y=Oldpt.y;
         npt.y=(short)(ppt.y-pt.y);
      }
      else
      {
      	pt.y=ppt.y;
         npt.y=0;
      }

      BitBlt(hTempDC,0,0,2*iWidth,2*iHeight,hBkgDC,pt.x,pt.y,SRCCOPY);
      BitBlt(hTempDC,npt.x,npt.y,iWidth,iHeight,hMemDC,0,0,SRCCOPY);
      BitBlt(hDC,pt.x,pt.y,2*iWidth,2*iHeight,hTempDC,0,0,SRCCOPY);
   }

   DeleteDC(hMemDC);
   DeleteDC(hBkgDC);
   DeleteDC(hTempDC);
   ReleaseDC(hWnd,hDC);
}

//#pragma argsused
BOOL CreateMaskBitmap(HBITMAP hbmSource,HBITMAP hbmDest,COLORREF crKey)
{
	HDC hDC,hMemDC,hMaskDC;
   BITMAP bm;
   COLORREF crTemp;
   int i,j;

   if(GetObject(hbmSource,sizeof(BITMAP),&bm)==0)
   	return FALSE;

   hDC=GetDC(NULL);
   hMemDC=CreateCompatibleDC(hDC);
   hMaskDC=CreateCompatibleDC(hDC);

   SelectObject(hMemDC,hbmSource);
   SelectObject(hMaskDC,hbmDest);

   BitBlt(hMaskDC,0,0,bm.bmWidth,bm.bmHeight,hDC,0,0,WHITENESS);

   for(i=0;i<bm.bmWidth;i++)
   {
   	for(j=0;j<bm.bmHeight;j++)
      {
      	crTemp=GetPixel(hMemDC,i,j);
      	if(crTemp!=crKey)
         	SetPixelV(hMaskDC,i,j,0x00000000);
         else
            SetPixelV(hMemDC,i,j,0x00000000);
      }
   }

   DeleteDC(hMemDC);
   DeleteDC(hMaskDC);
	ReleaseDC(NULL,hDC);
   return TRUE;
}

void MoveTransImage(HWND hWnd,HBITMAP hBkg,HBITMAP hBmp,HBITMAP hMaskBmp,HBITMAP hTemp,int iWidth,int iHeight,POINTS Oldpt,LONG lParam)
{
	HDC hDC,hMemDC,hBkgDC,hTempDC,hMaskDC;
   POINTS ppt,pt,npt;

   ppt=MAKEPOINTS(lParam);

   hDC=GetDC(hWnd);
   hMemDC=CreateCompatibleDC(hDC);
   hBkgDC=CreateCompatibleDC(hDC);
   hTempDC=CreateCompatibleDC(hDC);
   hMaskDC=CreateCompatibleDC(hDC);

   SelectObject(hMemDC,hBmp);
   SelectObject(hBkgDC,hBkg);
   SelectObject(hTempDC,hTemp);
   SelectObject(hMaskDC,hMaskBmp);

   if((ppt.x-Oldpt.x)>iWidth || (ppt.y-Oldpt.y)>iHeight)
   {
   	//BitBlt(hTempDC,0,0,2*iWidth,2*iHeight,hBkgDC,Oldpt.x,Oldpt.y,SRCCOPY);
      BitBlt(hDC,Oldpt.x,Oldpt.y,iWidth,iHeight,hBkgDC,Oldpt.x,Oldpt.y,SRCCOPY);

      BitBlt(hDC,ppt.x,ppt.y,iWidth,iHeight,hMaskDC,0,0,SRCAND);
      BitBlt(hDC,ppt.x,ppt.y,iWidth,iHeight,hMemDC,0,0,SRCINVERT);
   }
   else if((Oldpt.x-ppt.x)>iWidth || (Oldpt.y-ppt.y)>iHeight)
   {
   	//BitBlt(hTempDC,0,0,2*iWidth,2*iHeight,hBkgDC,Oldpt.x,Oldpt.y,SRCCOPY);
      BitBlt(hDC,Oldpt.x-iWidth,Oldpt.y-iHeight,2*iWidth,2*iHeight,hBkgDC,Oldpt.x-iWidth,Oldpt.y-iHeight,SRCCOPY);
      BitBlt(hDC,ppt.x,ppt.y,iWidth,iHeight,hMaskDC,0,0,SRCAND);
      BitBlt(hDC,ppt.x,ppt.y,iWidth,iHeight,hMemDC,0,0,SRCINVERT);
   }
   else
   {
      if(ppt.x>=Oldpt.x)
      {
      	pt.x=Oldpt.x;
         npt.x=(short)(ppt.x-Oldpt.x);
      }
      else
      {
      	pt.x=ppt.x;
         npt.x=0;
      }
      if(ppt.y>=Oldpt.y)
      {
      	pt.y=Oldpt.y;
         npt.y=(short)(ppt.y-pt.y);
      }
      else
      {
      	pt.y=ppt.y;
         npt.y=0;
      }

      BitBlt(hTempDC,0,0,2*iWidth,2*iHeight,hBkgDC,pt.x,pt.y,SRCCOPY);
      BitBlt(hTempDC,npt.x,npt.y,iWidth,iHeight,hMaskDC,0,0,SRCAND);
      BitBlt(hTempDC,npt.x,npt.y,iWidth,iHeight,hMemDC,0,0,SRCINVERT);
      BitBlt(hDC,pt.x,pt.y,2*iWidth,2*iHeight,hTempDC,0,0,SRCCOPY);
   }

   DeleteDC(hMemDC);
   DeleteDC(hBkgDC);
   DeleteDC(hTempDC);
   DeleteDC(hMaskDC);
   ReleaseDC(hWnd,hDC);
}

BOOL SaveBmp(HBITMAP hbm,LPCTSTR szFilename)
{
	BITMAPFILEHEADER bmfh;
   BITMAPINFOHEADER bmih;
   BITMAPINFO 		  bmif;
	BITMAP bm;
   ringFile rf = szFilename;
   LPBYTE lpbData;
   HDC hDC;

   if(GetObject(hbm,sizeof(BITMAP),&bm)==0)
      return FALSE;

   ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
   bmfh.bfType = 0x4d42;
   bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bm.bmWidth * bm.bmHeight * 3;
   bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

   if(!rf.Create(RF_NEW))
      return FALSE;

   if(!rf.Write(&bmfh,sizeof(BITMAPFILEHEADER),TRUE))
   {
      rf.Close();
      return FALSE;
   }

   ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER));
   bmih.biSize = sizeof(BITMAPINFOHEADER);
   bmih.biWidth = bm.bmWidth;
   bmih.biHeight = bm.bmHeight;
   bmih.biPlanes = 1;
   bmih.biBitCount = 24;
   bmih.biCompression = BI_RGB;

   if(!rf.Write(&bmih,sizeof(BITMAPINFOHEADER),TRUE))
      return FALSE;

   lpbData = (LPBYTE)New(bm.bmWidth*bm.bmHeight*3);
   if(lpbData == NULL)
   {
      rf.Close();
      return FALSE;
   }

   bmif.bmiHeader = bmih;

   hDC = GetDC(HWND_DESKTOP);
   GetDIBits(hDC,hbm,0,bm.bmHeight,lpbData,&bmif,DIB_RGB_COLORS);
   ReleaseDC(HWND_DESKTOP,hDC);

   if(!rf.Write(lpbData,bm.bmWidth*bm.bmHeight*3,TRUE))
   {
      Del(lpbData);
      rf.Close();
      return FALSE;
   }

   Del(lpbData);
   rf.Close();
   return TRUE;
}

BOOL DoDraw(HWND hWnd,HBITMAP hbm,int x,int y,int width,int height,int xPos,int yPos,DWORD dwRop)
{
	HDC hDC,hMemDC;

   hDC = GetDC(hWnd);
   hMemDC = CreateCompatibleDC(hDC);

   SelectObject(hMemDC,hbm);
   BitBlt(hDC,x,y,width,height,hMemDC,xPos,yPos,dwRop);
   DeleteDC(hMemDC);
   ReleaseDC(hWnd,hDC);

   return TRUE;
}

BOOL DoPaint(HWND hWnd,HBITMAP hbm,int x,int y,int width,int height,int xPos,int yPos,DWORD dwRop)
{
	HDC hMemDC;
   PAINTSTRUCT ps;

   BeginPaint(hWnd,&ps);
   hMemDC=CreateCompatibleDC(ps.hdc);
   SelectObject(hMemDC,hbm);
   BitBlt(ps.hdc,x,y,width,height,hMemDC,xPos,yPos,dwRop);
   DeleteDC(hMemDC);
   EndPaint(hWnd,&ps);

   return TRUE;
}

BOOL DoDrawTrans(HWND hWnd,HBITMAP hbm,HBITMAP hbmMask,int x,int y,int width,int height,int xPos,int yPos)
{
	HDC hDC,hMemDC,hMaskDC;

   hDC = GetDC(hWnd);
   hMemDC = CreateCompatibleDC(hDC);
   hMaskDC = CreateCompatibleDC(hDC);

   SelectObject(hMemDC,hbm);
   SelectObject(hMaskDC,hbmMask);
   BitBlt(hDC,x,y,width,height,hMaskDC,xPos,yPos,SRCAND);
   BitBlt(hDC,x,y,width,height,hMemDC,xPos,yPos,SRCINVERT);
   DeleteDC(hMaskDC);
   DeleteDC(hMemDC);
   ReleaseDC(hWnd,hDC);

   return TRUE;
}
*/